
// 静态库：程序在编译链接的时候就把库的代码链接到可执行文件中，程序运行的时候不再需要静态库
// 动态库：程序在运行的时候才会去链接动态库的代码，多个程序共享库的代码
// 一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表，而不是外部函数所在目标文件的整个机器码
// 在可执行文件运行之前，外部函数的机器码由操作系统从磁盘上的该动态库复制到内存中，这个过程称为动态链接
// 动态库可以在多个程序间共享，所以动态链接使得可执行文件更小，节省磁盘空间
// 操作系统采用进程地址空间机制（虚拟内存机制）得以允许物理内存中的一份动态库被多个进程公用，节省内存与磁盘空间

// 生成位置无关码(position independent code)
// g++ -fPIC -c add.cpp sub.cpp
// 生成动态库
// g++ -shared -o libmymath.so add.o sub.o

// 编译
// g++ test.cc -o test -std=c++11 -I . -L . -l mymath
// -I:指定头文件搜索目录
// -L:指定动静态库搜索目录
// -l:指定动静态库名

// 运行动态库！！！
// 1.拷贝.so文件到/usr/lib64
// 2.更改环境变量LD_LIBRARY_PATH
// export LD_LIBRARY_PATH=.
// 3.配置ldconfig
// 在目录/etc/ld.so.conf.d/创建.conf配置文件
// cat /etc/ld.so.conf.d/
// 使用指令ldconfig使之生效

// 查看一个可执行文件所依赖的动态库
// ldd 可执行文件名
// 例如: ldd test

// 预处理: 头文件展开、去注释、宏替换、条件编译等，形成.i文件
// g++ -E test.cc -o test.i
// 编译: 词法翻译、语法翻译、语义分析、符号汇总等，检查无误后将代码翻译为汇编指令，形成.s文件
// g++ -S test.cc -o test.s
// 汇编: 将汇编指令转换为二进制指令，形成.o文件
// g++ -c test.cc -o test.o
// 链接: 将生成的各个.o文件进行链接，形成最后的可执行文件

#include <iostream>
#include "add.h"
#include "sub.h"

using namespace std;

int main()
{
    cout << "10 + 2 = " << add(10, 2) << endl;
    cout << "10 - 2 = " << sub(10, 2) << endl;
    return 0;
}